package cn.itsource.ymcc.service.impl;

import cn.itsource.ymcc.domain.Logininfo;
import cn.itsource.ymcc.dto.LoginDto;
import cn.itsource.ymcc.jwt.JwtUtils;
import cn.itsource.ymcc.jwt.PayloadData;
import cn.itsource.ymcc.jwt.RsaUtils;
import cn.itsource.ymcc.mapper.LogininfoMapper;
import cn.itsource.ymcc.result.JsonResult;
import cn.itsource.ymcc.service.ILogininfoService;
import cn.itsource.ymcc.util.AssertUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

import java.security.PrivateKey;
import java.util.HashMap;
import java.util.Map;

/**
 * <p>
 * 登录表 服务实现类
 * </p>
 *
 * @author whale.chen
 * @since 2023-02-24
 */
@Service
public class LogininfoServiceImpl extends ServiceImpl<LogininfoMapper, Logininfo> implements ILogininfoService {
    @Value("${jwt.rsa.pri}")
    private String pri;
    /**
     * 门户网站和后台登录的统一认证接口
     * @param loginDto
     * @return
     */
    @Override
    public JsonResult accountLogin(LoginDto loginDto) {
        //1.通过用户名查询该用户是否在数据库中 selectOne表示查询一个数据
        Logininfo logininfo = baseMapper.selectOne(new QueryWrapper<Logininfo>()
                .eq("username", loginDto.getUsername()));
        //2.校验查询的对象非空
        AssertUtil.isTrue(logininfo!=null,"用户不存在");

        //3.校验密码是否正确 encode加密密码  matches 会将第一个参数加密之后与第二个参数做比较
        AssertUtil.isTrue(new BCryptPasswordEncoder().matches(loginDto.getPassword(),logininfo.getPassword()),"密码错误");

        //登录成功封装返回的对象
        try {

            //构建载荷
            PayloadData payloadData = new PayloadData();
            //将用户密码设置为空
            logininfo.setPassword(null);
            //将用户的信息等封装到载荷中
            payloadData.setLogininfo(logininfo);
            //0是管理员
            if (loginDto.getType()==0){

            }else{//1是用户
                //用户什么都不用管
            }

            //获取token
            PrivateKey privateKey = RsaUtils.getPrivateKey(JwtUtils.class.getClassLoader().getResource(pri).getFile());
            String token = JwtUtils.generateTokenExpireInMinutes(payloadData, privateKey, 600);

            //将hashmap返回前端
            Map<String,Object> map = new HashMap<>();
            map.put("jwtToken",token);
            map.put("logininfo",logininfo);

            return JsonResult.me(map);
        } catch (Exception e) {
            e.printStackTrace();
            return JsonResult.error("登录失败");
        }
    }
}
